gusucode.com > VC++视频目标检测演示帧间差分法-源码程序 > VC++视频目标检测演示帧间差分法-源码程序/code/Video Demo/DBLinkedList.cpp
//Download by http://www.NewXing.com #include "stdafx.h" #include "DBLinkedList.h" #include "stdlib.h" Node::Node():avai(false),next(NULL),previous(NULL){ // 数据置空 nodedata.data = NULL; nodedata.size = 0; } Node::Node(void *_info,int size, Node *_next,Node *_previous): next(_next),previous(_previous),avai(true){ nodedata.data = malloc(size); // 数据内存空间 memcpy(nodedata.data,_info,size); nodedata.size = size; } Node::~Node(){ // 释放数据内存空间 free(nodedata.data); } void * Node::GetInfo(){ return nodedata.data; } void Node::SetInfo(void *info,int size){ //this->info = info; if(this->nodedata.data != NULL) free(nodedata.data); // 数据拷贝 nodedata.data = malloc(size); memcpy(nodedata.data,info,size); } void Node::SetNext(Node *next){ this->next = next; } void Node::SetPrevious(Node *previous){ this->previous = previous; } Node* Node::GetPrevious(){ return this->previous; } Node* Node::GetNext(){ return this->next; } bool Node::GetAvai(){ return this->avai; } DBLinkedList::DBLinkedList():head(NULL),rear(NULL),currentPtr(NULL){ head = NULL; rear = NULL; } DBLinkedList::~DBLinkedList(){ Destory(); } // 最加数据 bool DBLinkedList::Append(void *info,int size){ if(head == NULL){ head = new Node(info,size,NULL,NULL); rear = head; currentPtr = head; }else{ rear->SetNext(new Node(info,size,NULL,rear)); rear = rear->GetNext(); } return true; } // 插入数据 // last是前一个指针 bool DBLinkedList::Add(void *info,int size,Node* last){ // 如果是最后一个元素 if(last == NULL || last == rear || head == NULL){ this->Append(info,size); return true; } Node* next = last->GetNext(); last->SetNext(new Node(info,size,next,last)); if(next != NULL) next->SetPrevious(last->GetNext()); if(this->rear == last){ rear = last->GetNext(); } return true; } bool DBLinkedList::Delete(Node *curr){ if(curr == NULL) return false; // 如果只有一个元素 if(curr->GetPrevious() == NULL && curr->GetNext() == NULL){ //如果是第一个元素删除,或者唯一一个元素 head = NULL; rear = NULL; delete curr; return true; } // 如果删除的是第一个元素 if(curr->GetPrevious() == NULL){ // 取得下一个元素 head = curr->GetNext(); head->SetPrevious(NULL); delete curr; return true; } // 如果删除的是最后一个元素 if(curr->GetNext() == NULL){ // 如果删除的是最后一个元素 rear = curr->GetPrevious(); rear->SetNext(NULL); delete curr; return true; } // 如果删除的是中间元素 if(curr->GetNext() != NULL && curr->GetPrevious() != NULL) { // 如果删除的是中间的元素 Node * previous = curr->GetPrevious(); Node * next = curr->GetNext(); delete curr; previous->SetNext(next); next->SetPrevious(previous); return true; } return true; } void* DBLinkedList::GetInfo(Node *node){ return node->GetInfo(); } Node* DBLinkedList::GetNext(){ return currentPtr->GetNext(); } Node* DBLinkedList::GetPrevious(){ return currentPtr->GetNext(); } Node* DBLinkedList::GetCurrent(){ return currentPtr; } void* DBLinkedList::GetCurrentInfo(){ if(currentPtr == NULL) return NULL; return currentPtr->GetInfo(); } void* DBLinkedList::GetNextInfo(){ currentPtr = currentPtr->GetNext(); if(currentPtr == NULL){ currentPtr = head; return NULL; } return currentPtr->GetInfo(); } void * DBLinkedList::GetPreviousInfo(){ currentPtr = currentPtr->GetPrevious(); if(currentPtr == NULL){ currentPtr = rear; return NULL; } return currentPtr->GetInfo(); } /* * 函数:Destory * 功能:销毁 */ void DBLinkedList::Destory(){ //遍历 Node *curr = head; Node *next = NULL; if(head != NULL) next = head->GetNext(); else return; for(;curr != NULL;curr = next){ next = curr->GetNext(); delete curr; } head = NULL; rear = NULL; } /* * 函数: ResetCurrentPtr * 功能: 重新设置CurrentPtr的位置到头或者尾 */ void DBLinkedList::ResetCurrentPtr(bool head){ if(head){ currentPtr = this->head; }else{ currentPtr = rear; } } /* * GetLastInfo * 功能:获得表末尾的数据 */ void *DBLinkedList::GetLastInfo(){ if(rear != NULL) return rear->GetInfo(); return NULL; } /* * DeleteLast * 功能:删除最后一个位置的节点 */ bool DBLinkedList::DeleteLast(){ return this->Delete(this->rear); }